﻿/************************************************************************
 * 项目名称 :  Lm.Core.TaskQueue  
 * 项目描述 :     
 * 类 名 称 :  TaskQueueHelper
 * 版 本 号 :  v1.0.0.0 
 * 说    明 :     
 * 作    者 :  Lewis
 * 创建时间 :  2022/4/13 10:44:46
 * 更新时间 :  2022/4/13 10:44:46
************************************************************************/

using System;
using log4net;
using Moreeasi.TaskQueue;
using Prism.Events;
using Prism.Ioc;
using System.ComponentModel;
using System.Threading;
using Modules.MSentEvent;
using Modules.Units;
using Sorting.App.Models;
using Sorting.App.Models.Enum;
using Sorting.App.Models.Entity;

namespace Lm.Core.TaskQueue
{


    public class TaskQueueHelper
    {


        private static IEventAggregator _ea;
        private readonly IContainerExtension _container;

        private static readonly ILog _log = LogManager.GetLogger(typeof(TaskQueueHelper));
        private static bool IsStartRead = false;

        private static Semaphore semaphore = new Semaphore(0, 1024);


        public TaskQueueHelper(IEventAggregator ea, IContainerExtension container)
        {
            _ea = ea;
            _container = container;


        }


        #region 任务执动作处理相关

        /// <summary>
        /// 任务队列
        /// </summary>
        public static PutDrugTaskQueue<UnitTask> PutDrugTask;

        public static RunTaskQueue<UnitTask> RunMainTask;

        public static CountStoreQueue<UnitTask> CountStoreTask;


        public static void initCountStoreTask()
        {
            CountStoreTask = new CountStoreQueue<UnitTask>("计数队列");



            CountStoreTask.Start();
        }



        public static void initRunScanManTask()
        {
            PutDrugTask = new PutDrugTaskQueue<UnitTask>("人员放药任务队列");
            #region 任务队列V2事件


            //入队响应
            PutDrugTask.TaskEnqueued += new EventHandler<UnitTask>((s, v) =>
            {
                System.Diagnostics.Debug.WriteLine($"<{((PutDrugTaskQueue<UnitTask>)s).Name}> 入队了新任务：[{v.Name}]");
 
                //如果队列中有一个，则移除上一个，确保队列中只保留一个
                if (PutDrugTask.TaskCount > 1)
                {
                    var DefaultNo = AppsettingUnits.Appseeting.DefaultNo;
                    var task = PutDrugTask.Peek();
                    if (_ea is not null  && task is not null)
                    {
                        var data = new BarcodeWardDto
                        {
                            Barcode = DefaultNo.ToString().Trim(),
                            WardCode= DefaultNo.ToString().Trim(),
                        };
                        _ea.GetEvent<ViewModelSentEvent>().Publish(new MessageModel
                        {
                            Code = EnumMessageType.ME104,
                            Data = data,
                            Message = $"扫描信息【{DefaultNo}】"
                        });
                    }
                    PutDrugTask.Dequeue();
                }

            });

            PutDrugTask.TaskDequeued += new EventHandler((s, v) =>
            {
                System.Diagnostics.Debug.WriteLine($"<{((PutDrugTaskQueue<UnitTask>)s).Name}>有任务出队，剩余任务个数：[ ]");
                //_log.Info($"<{((PutDrugTaskQueue<UnitTask>)s).Name}>有任务出队，剩余任务个数：[ ]");
            });

            PutDrugTask.Idle += new EventHandler((s, v) =>
            {
                System.Diagnostics.Debug.WriteLine($"<{((PutDrugTaskQueue<UnitTask>)s).Name}> 进入空闲状态 ...");
                //_log.Info($"<{((PutDrugTaskQueue<UnitTask>)s).Name}> 进入空闲状态 ...");
            });

            PutDrugTask.QueueStarted += new DoWorkEventHandler((s, v) =>
            {
                System.Diagnostics.Debug.WriteLine($"<{((PutDrugTaskQueue<UnitTask>)s).Name}> 任务开始执行 ...");
                //_log.Info($"<{((PutDrugTaskQueue<UnitTask>)s).Name}> 任务开始执行 ...");
            });

            PutDrugTask.QueueStoped += new RunWorkerCompletedEventHandler((s, v) =>
            {
                System.Diagnostics.Debug.WriteLine($"<{((PutDrugTaskQueue<UnitTask>)s).Name}> 任务停止执行 ...");
                //_log.Info($"<{((PutDrugTaskQueue<UnitTask>)s).Name}> 任务停止执行 ...");
            });

            #endregion

            PutDrugTask.Start();
        }

        public static  void InitRunManTaskA()
        {
            RunMainTask = new RunTaskQueue<UnitTask>("扫描下发任务队列");

            #region 任务队列V2事件

            RunMainTask.TaskEnqueued += new EventHandler<UnitTask>((s, v) =>
            {
                System.Diagnostics.Debug.WriteLine($"<{((RunTaskQueue<UnitTask>)s).Name}> 入队了新任务：[{v.Name}]");
                //_log.Info($"扫描入队新任务[{v.Name},{v.TaskId}]=={DateTime.Now}");
            });

            RunMainTask.TaskDequeued += new EventHandler((s, v) =>
            {
                System.Diagnostics.Debug.WriteLine($"<{((RunTaskQueue<UnitTask>)s).Name}>有任务出队，剩余任务个数：[ ]");
                //_log.Info($"<{((RunTaskQueue<UnitTask>)s).Name}>有任务出队，剩余任务个数：[ ]");
            });

            RunMainTask.Idle += new EventHandler((s, v) =>
            {
                System.Diagnostics.Debug.WriteLine($"<{((RunTaskQueue<UnitTask>)s).Name}> 进入空闲状态 ...");
                //_log.Info($"<{((RunTaskQueue<UnitTask>)s).Name}> 进入空闲状态 ...");
            });

            RunMainTask.QueueStarted += new DoWorkEventHandler((s, v) =>
            {
                System.Diagnostics.Debug.WriteLine($"<{((RunTaskQueue<UnitTask>)s).Name}> 任务开始执行 ...");
                //_log.Info($"<{((RunTaskQueue<UnitTask>)s).Name}> 任务开始执行 ...");
            });

            RunMainTask.QueueStoped += new RunWorkerCompletedEventHandler((s, v) =>
            {
                System.Diagnostics.Debug.WriteLine($"<{((RunTaskQueue<UnitTask>)s).Name}> 任务停止执行 ...");
                //_log.Info($"<{((RunTaskQueue<UnitTask>)s).Name}> 任务停止执行 ...");
            });

            #endregion

            RunMainTask.Start();
        }
        

        #endregion


    }
}
